package com.rmb.pool;

import com.alibaba.druid.util.StringUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rmb.entity.SourceEntity;
import com.rmb.fremarker.config.RedisConfig;
import org.json.JSONObject;
import org.springframework.stereotype.Repository;
import redis.clients.jedis.Jedis;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author ZhaoMuYang
 */
@Repository
public class RedisConnention {
    private static boolean whetherConnection = true;
    /** 数据连接池*/
    private static Map<String, Jedis> REDIS_CONNEC_MAP = new ConcurrentHashMap<>(16);

    /**
     * 最大连接数 默认值：8
     */
    private static Integer maxTotal = RedisConfig.REDIS_MAXTOTAL;
    /**
     * redis数据源测试
     * @param sourceEntity 数据实体
     */
    public static boolean judgeConnected(SourceEntity sourceEntity) {
        Jedis jedis;

        try {
            if(sourceEntity.getId() != null && REDIS_CONNEC_MAP.containsKey(sourceEntity.getDatabaseName())){
                jedis= REDIS_CONNEC_MAP.get(sourceEntity.getDatabaseName());
            }else{
                jedis=new Jedis(sourceEntity.getHost(), sourceEntity.getPort());
                if(sourceEntity.getPassword()!=null){
                    jedis.auth(sourceEntity.getPassword());
                }
            }
            jedis.set(sourceEntity.getDatabaseName(),String.valueOf(sourceEntity));
        } catch (Exception e) {
            whetherConnection = false;
        }
        return whetherConnection;
    }



    /**
     * 在jedispool中最大的idle状态(空闲的)的jedis实例的个数
     */
    private static Integer maxIdle = RedisConfig.REDIS_MAXIDLE;

    /**
     * 在jedispool中最小的idle状态(空闲的)的jedis实例的个数
     */
    private static Integer minIdle = RedisConfig.REDIS_MINIDLE;

    /**
     * 在borrow一个jedis实例的时候，是否要进行验证操作，如果赋值true。则得到的jedis实例肯定是可以用的。
     */
    private static Boolean testOnBorrow = RedisConfig.REDIS_TESTONBORROW;

    /**
     * 在return一个jedis实例的时候，是否要进行验证操作，如果赋值true。则放回jedispool的jedis实例肯定是可以用的。
     */
    private static Boolean testOnReturn = RedisConfig.REDIS_TESTONBORROW;

    public static Jedis initPool(SourceEntity sourceEntity){

        if (StringUtils.isEmpty(sourceEntity.getHost())&& StringUtils.isEmpty(sourceEntity.getPort().toString())) {
            return null;
        }
        if(REDIS_CONNEC_MAP.containsKey(sourceEntity.getDatabaseName())){
            return REDIS_CONNEC_MAP.get(sourceEntity.getDatabaseName());
        }

        Jedis jedis = new Jedis(sourceEntity.getHost(), sourceEntity.getPort());
        REDIS_CONNEC_MAP.put(sourceEntity.getDatabaseName(), jedis);

        return jedis;
    }
}
